package com.axios.utils;

import org.json.JSONArray;
import org.json.JSONObject;

import java.lang.reflect.Field;
import java.util.ArrayList;

// JSON方法实现（设为泛型类，可以在实例化时接受不同类型的参数）
public class JsonBale<T>{
    // 给打包JSON数组的方法提供打包单个JSON对象用的支持方法
    public JSONObject creatJSONObjForJSONArr(String[] keys, Object[] values) {
        // 声明一个JSON对象
        JSONObject obj = new JSONObject();
        // 遍历传入的键组
        for (int i = 0; i < keys.length; i++) {
            // 建组的值组一并塞入JSON对象中
            obj.put(keys[i],values[i]);
        }
        // 返回这个处理完的对象
        return obj;
    }

    // 打包一个JSON数组
    public JSONArray creatJSONArr(ArrayList<T> list){
        // 声明一个JSON数组
        JSONArray JSONs = new JSONArray();
        // 遍历传入的数组
        for (T obj : list) {
            // 通过反射获取对象的class对象
            Class<?> objClass = obj.getClass();
            // 获取这个class对象声明的所有字段
            Field[] declaredFields = objClass.getDeclaredFields();
            // 声明键组和值组，长度与字段数量相同
            String[] keys = new String[declaredFields.length];
            Object[] values = new Object[declaredFields.length];
            // 计数
            int index = 0;
            // 遍历字段
            for (Field declaredField : declaredFields) {
                // 改变访问权限，方便搞到私有字段
                declaredField.setAccessible(true);
                // 取到字段名
                keys[index] = declaredField.getName();
                // 取到字段值
                try {
                    values[index] = declaredField.get(obj);
                } catch (IllegalAccessException e) {
                    throw new RuntimeException(e);
                }
                // 计数增加
                index++;
            }
            // 将成对的键组和值组一并打包为JSON对象，并塞进JSON数组
            JSONs.put(creatJSONObjForJSONArr(keys,values));
        }
        // 返回这个JSON数组
        return JSONs;
    }
}
